<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 并发请求 （控制同一时刻发送的请求数量，一个结束立马发送下一个）
      function concurRequest(urls, maxNum) {
        return new Promise((resolve, reject) => {
          const result = [];
          if (urls.length === 0) {
            resolve([]);
            return;
          }
          // 记录当前下标
          let index = 0;
          function request() {
            // 确保每次请求结果按顺序排放
            let i = index;
            // 当前下标的异步请求结束，往后移
            index++;
            // 模拟真实请求时间不同情况
            let currentTime = getRandomInt(1, 3);
            // 模拟异步请求
            setTimeout(() => {
              result[i] = urls[i];
              if (index >= urls.length) {
                // 如果到最后一个就直接返回
                resolve(result);
              } else {
                // 一个请求结束后继续下一个请求
                request();
              }
            }, currentTime * 1000);
          }
          const min = Math.min(maxNum, urls.length);
          for (let i = 0; i < min; i++) {
            request();
          }
        });
      }
      // 获取随机数
      function getRandomInt(min, max) {
        min = Math.ceil(min); // 确保最小值是一个整数
        max = Math.floor(max); // 确保最大值是一个整数
        return Math.floor(Math.random() * (max - min + 1)) + min;
      }

      // 调用
      const url = [];
      for (let i = 0; i < 50; i++) {
        url.push(i + "is OK");
      }
      concurRequest(url, 60).then((res) => {
        console.log(res);
      });
    </script>
  </body>
</html>
